// key/value形式传递 @PostMapping("/user1") public User addUser1(User user){ return user; } //json传递 @PostMapping("/user2") public User addUser2(@RequestBody User user){ return user; }
接下来,我们在 consumer 中调这两个 POST 接囗。
这里的 post 和前面的 get 很像,只是多出来了三个方法,就是 postForLocation,另外,两个 postForObject 和 postForEntiy 和前面 get 基不一致,所以这里我们主要来看 postForObject, 看完之后,我们再来看这个额外的 postForLocation。
@GetMapping("/hello6") publicvoidhello6(){ MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); map.add("username","javajava"); map.add("password","123456"); map.add("id",666); User user = restTemplate.postForObject("http://provider/user1", map, User.class); System.out.println("1:"+user); user.setId(888); user = restTemplate.postForObject("http://provider/user2", user, User.class); System.out.println("2:"+user); }
post 参数到底是 k/v 形式还是 json 形式,主要看第二个参数,如果第二个参数是 MultiValueMap,则参数是以 k/v 形来传递的。 如果是一个普通对象,则参数是以的 son 形式 传递。
最后再看看一下 postForLocation。有的时候,当执行完一个 post 请求之后,立马要进行重定向, 一个非常常见的场景就是注册,注册是一个 post 请求,注册完成之后,立马重定向到登录页面去登录。对于这种场景,我们就可以便用 postForLocation。
首先我们在 provider 上提供一个用户注册接囗:
@Controller publicclassRegisterController{ @PostMapping("/register") public String register(User user){ return"redirect:http://provider/loginPage?username="+user.getUsername(); } @GetMapping("/loginPage") @ResponseBody public String loginPage(String username){ return"loginPage:"+username; } }
注意:
这里的 post 接口,响应一定是 302,否则 postForLocaton 无效。 重定向的地址,一定要写成绝对路径,不要写成相对路径,否则在 consumer 中调用时会出问题
@GetMapping("/hello7") publicvoidhello7(){ MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); map.add("username", "javajava"); map.add("password", "123456"); map.add("id", 666); //这就是postForLocation,调用该方法返回的是一个Uri,Uri就是重定向的地址(里面包含重定向的参数),拿到Uri之后,就可以直接发送新的请求了 URI uri = restTemplate.postForLocation("http://provider/register", map); String s = restTemplate.getForObject(uri, String.class); System.out.println(s); }